Redeema's Vitual Pool Hall v2.5.9.2 Cracking tut

                   _      _      _  _____  _____  _____  ____   ____  
                  | |    | |    |_||___  ||___  ||  _  ||  _ \ |  _ \
                  | |___ | |     _    / /    / / | |_| || |_| || | | |
                  |  _  || |    | |  / /    / /  |  _  ||    / | | | |
                  | |_| || |___ | | / /__  / /__ | | | || |\ \ | |_| |
                  |_____||_____||_||_____||_____||_| |_||_| \_\|____/
		

!THIS TUTORIAL IS COMPLETELY WRITTEN IN GERMAN!
!IT IS WRITTEN FOR SN00PEE'S DOGHOUSE AND CRACKSTORE!
!TO ALL ENGLISH READERS READ THE TEXT AT THE END!

Dieses Tutorial ist nicht nachtrglich auf Rechtschreibfehler, Grammatikfehler oder unvollstndige
Stze berprft worden :-)

Vorwort:
----------------------------------------------
Ich stelle mich hier nur mal kurz vor.
Ich bin Redeema von bLiZZARD und habe mich entschlossen ein crack tut zu schreiben ;-)
Gleich zu Begin, dieses tut ist zwar fr totale Anfnger gedacht, aber ich halte es nicht
fr sinnvoll dies als allererstes tut zu benutzen, aber schaden knnte das wohl auch nicht.
Ich denke eher Ihr solltet dieses tut lesen, wenn Ihr etwas aus anderen tuts, zB von sn00pee
oder gONZo nicht verstanden habt oder nicht nachvollziehen konntet...
Sicherlich werdet Ihr einige Rechtschreibfehler, ob nach alter oder neuer Reform  in diesem tut finden :)
Warum ich dieses tut schreibe? Nun, da ich wie Kollege sn00pee der Meinung bin, dass es viel zu
wenige deutsche tuts gibt und ich hab' mich mal nach Cracks fr Virtual Pool Hall
umgesehen und nur Scheisse gefunden, irgendwelche komischen Cracks mit Fehlern und 
Einschrnkungen, und da man bei dem Game ein paar generelle Sachen bers Cracken + CD Protections
zeigen kann, habe ich das jetzt selbst in die Hand genommen.
Was ist an diesem tut evtl. anders als bei den vielen anderen?
Also, ich werde Euch in diesem tut versuchen nahezulegen, wie der man einen Weg findet ein
Programm zu cracken. Ich habe mich wirklich bemht die einzelnen Schritte bei der Analyse eines
Programmes zu erklren. Bei vielen, eigentlich bei zuvielen hab irgendwelches Geschwalle ohne
richtige Erklrung gefunden und habe versucht, das hier so ausfhlich wie mglich zu machen.
Wenn du ein Profi bist, wirst du hier vermutlich nicht viel neues finden...


Los geht's!

Was cracken wir heute?
----------------------------------------------
Du wirst es sicherlich schon erraten haben, aber ich wiederhole es trotzdem :)

Virtual Pool Hall v2.5.9.2

Warum Virtual Pool Hall? Nun, ich bin mir schon bewusst, dass viele Leute dieses game weder
kennen noch besitzen, ich hab's auch nur aus den netz gesaugt, aber ber die warez ftp channels
kann man es recht leicht finden und downloaden, sorry fr die, die es nicht finden. Ihr knnt
mich in diesem Fall auch kontaktieren und es direkt von mir haben...
Du hast diese Version nicht?
Egal, geh' auf www.vpool.com und lade das Update runter.
Wenn es Probleme bei der Installation dieses Updates gibt, les' den Text am Ende des tuts...

Was braucht man, um dieses game zu cracken?
----------------------------------------------
1.Windows32 Disassembler v8.xx
2.Hiew 5 oder 6
3.Soft-Ice
4.Assembler Kentnisse sind immer vorteilhaft
5.Virtual Pool Hall v2.5.9.2 ;-)

Jetzt aber ran an den Speck.
----------------------------------------------
Also wir starten jetzt das Spiel, ohne CD natrlich.
Was kommt?
 ________________________________________________
|CD Error                                        |
|  					         |
|    Virtual Pool Hall CD not in CDROM drive     |
|						 |
|     [   Retry   ]	     [    Exit    ]	 |
|________________________________________________|

Jetzt starten wir den guten alten Disassembler (schliessen VPHALL natrlich vorher!), um das
Programm analysieren zu knnen.
So, der macht jetzt ein bissel rum, und nun, wie in jedem tut erwhnt: wenn du nur irgendwelche
unlesbaren Zeichen liest, musst du dir Schriftart ndern unter: Disassembler/Font/Select Font.
Nun versuchen wir erstmal die Stellen ausfindig zu machen, an denen dieser Fehlertext verwendet
wird.
OK, wir klicken jetzt auf String Data References (Das Icon links neben dem Drucksymbol). Die String Data Reference des Disassemblers zeigt einem, welche Strings, also Zeichenketten wie: "CD Error" in einem Programm verwendet werden. Wir suchen also nach dem Anfangswort unseres
Fehlertextes : "Virtual" wegen "Virtual Pool Hall CD not in CDROM drive". Bei einigen Spielen
findet man so schon die richtige Stelle. Uff nix gefunden, was jetzt?
Hmm, versuchen wir mal die Textsuchfunktion des Disassemblers (Das Icon mit der Taschenlampe) und suchen nach "CD Error", nicht nach dem ganzen String des Fehlertextes, weil es oft so ist, dass lngere Strings vom Disassembler aufgespalten werden und man somit nix findet.
Man sucht also und pltzlich, hey wir finden folgendes:

Name: DialogID_0090, # of Controls=003, Caption:"CD Error", ClassName:""
     001 - ControlID:0001, Control Class:"BUTTON" Control Text:"Retry" 
     002 - ControlID:0002, Control Class:"BUTTON" Control Text:"Exit" 
     003 - ControlID:FFFF, Control Class:"STATIC" Control Text:" Virtual Pool Hall CD not  in CDROM drive" 

Aha, hier handelt es sich eindeutig um die Strings der Fehlerbox, die wir gesehen haben. Also
gehen wir auf Dialog References (Links neben String Data References) und suchen nach der richtigen ID der Dialogbox. Wie bitte? ID??. Nun jede Dialogbox, jedes Fenster, jeder Button besitzt eine ID, man kann sagen, sein Erkennungszeichen, hier ist diese : DialogID_0090. So,
jetzt suchen wir sie einfach raus.
Doppelklick drauf!
Hier ist jetzt der Grund, warum diese tut nicht als erstes tut geeignet ist. Ich kann an dieser
Stelle nicht jeden Assembler Befehl einzelnd erkren, das tut ist so schon gross genug geraten...
Aber es ist nicht so schlimm, wenn ihr keine Ahnung von Assembler habt, knnt ihr diesen
Schritt leider nicht nachempfinden, ist aber nicht schlimm ;-).
Jetzt schaut man sich den Code an und traced (so nennt man es, wenn man sich den Code nach und
nach anschaut und ihn analysiert) ein bischen darin herum und merkt, das ist auf jeden Fall kein CD-Check. Jetzt nochmal einen Doppelklick auf die ID!
Hmm, das scheint uns auch nicht viel weiter zu helfen, wenn wir durch den code tracen.
So, hier habe ich etwas eingebracht, was ich bisher in keinem anderen tut gefunden habe : Ich
habe erklrt, was offensichtlich ist zu machen, auch wenn es hier nichts bringt. Ich habe als
Newbie grosse Probleme gehabt sowas nachzuvollziehen, weil es, warum auch immer, nie gesagt wird.
Also hier nochmal : Ihr msst immer probieren, es passiert in den seltesten Fllen dass man ein
Programm nach dem ersten Blick knacken kann...
Weiter, jetzt mssen das Programm auf CD-Check typische Eigenschaften berprfen. Eine fr 
eigentlich so gut wie alle CD-Checks typische Eigenschaft ist die API Funktion GetDriveType.
Fr diese Funktion mssen sg. Parameter berliefert werden, also Daten, die diese Funktion
bentigt um eine Handlung auszufhren und/oder ein Ergebnis zu liefern. Diese Funktion ermittelt
den Typ eines angebenen Laufwerkes : A: ist zB ein Diskettenlaufwerk...
Also suchen wir, an welcher Stelle dieses Programm diese Funktion benutzt.
So, gehen wir auf Import Functions (das 8te Icon von rechts) und suchen nach GetDriveTypeA.
Warum GetDriveTypeA? Das A kommt daher, dass zwischen 16Bit und 32Bit Funktionen unterschieden
wird und hier heisst es einfach, dass es sich um eine 32Bit Funktion handelt.
Nach mehrmaligem Doppelklicken darauf stellt man fest, dass GetDriveTypeA nur zweimal im ganzen Code vorkommt und noch besser, die zweite Stelle kann man sowieso vermutlich weglassen. Warum? Ganz einfach. Sehr viele CD-Checks haben direkt nach so einem Call von GetDriveType ein:

cmp eax, 00000005
jne ...

was bedeutet das jetzt?
Diese Code vergleicht, ob das angegebene Laufwerk ein CD-ROM Laufwerk ist, CMP steht fr compare und vergleicht hier ein sg Register, eine Speiherzelle mit der Zahl 5, welche fr die ID des
CD-Rom Laufwerkes steht. Und da bei der zweiten Stelle im Code ein solcher Call fehlt, ist das vermutlich kein CD-Check.
So, bei der ersten Stelle ist dies der Fall, folglich ist das sehr wahrscheinlich ein CD-Check.
Jetzt sind wir schon um einiges weiter :)
Jetzt schauen wir also weiter.


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CE841(C)
|

* Reference To: KERNEL32.GetLogicalDrives, Ord:0120h
                                  |
:004CE752 FF1500614F00            Call dword ptr [004F6100]
:004CE758 8945FC                  mov dword ptr [ebp-04], eax
:004CE75B C645F841                mov [ebp-08], 41

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CE81A(U)
|
:004CE75F 837DFC00                cmp dword ptr [ebp-04], 00000000
:004CE763 0F84B6000000            je 004CE81F
:004CE769 8B55FC                  mov edx, dword ptr [ebp-04]
:004CE76C 83E201                  and edx, 00000001
:004CE76F 85D2                    test edx, edx
:004CE771 0F8493000000            je 004CE80A
:004CE777 8D45F8                  lea eax, dword ptr [ebp-08]
:004CE77A 50                      push eax

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
                                  |
:004CE77B FF1504614F00            Call dword ptr [004F6104]
:004CE781 83F805                  cmp eax, 00000005
:004CE784 0F8580000000            jne 004CE80A
:004CE78A 8D4DF8                  lea ecx, dword ptr [ebp-08]
:004CE78D 51                      push ecx
:004CE78E 68C09A5800              push 00589AC0
:004CE793 E8982A0100              call 004E1230
:004CE798 83C408                  add esp, 00000008
:004CE79B 8D55F8                  lea edx, dword ptr [ebp-08]
:004CE79E 52                      push edx
:004CE79F 8D8578FFFFFF            lea eax, dword ptr [ebp+FFFFFF78]
:004CE7A5 50                      push eax
:004CE7A6 E8852A0100              call 004E1230
:004CE7AB 83C408                  add esp, 00000008

* Possible StringData Ref from Data Obj ->"\vphalld\sstrats.mve"
                                  |
:004CE7AE 68A0E75000              push 0050E7A0
:004CE7B3 8D8D78FFFFFF            lea ecx, dword ptr [ebp+FFFFFF78]
:004CE7B9 51                      push ecx
:004CE7BA E8812A0100              call 004E1240
:004CE7BF 83C408                  add esp, 00000008

* Possible StringData Ref from Data Obj ->"r"
                                  |
:004CE7C2 68B8E75000              push 0050E7B8
:004CE7C7 8D9578FFFFFF            lea edx, dword ptr [ebp+FFFFFF78]
:004CE7CD 52                      push edx
:004CE7CE E82D4B0100              call 004E3300
:004CE7D3 83C408                  add esp, 00000008
:004CE7D6 898574FFFFFF            mov dword ptr [ebp+FFFFFF74], eax
:004CE7DC 83BD74FFFFFF00          cmp dword ptr [ebp+FFFFFF74], 00000000
:004CE7E3 7425                    je 004CE80A
:004CE7E5 8B8574FFFFFF            mov eax, dword ptr [ebp+FFFFFF74]
:004CE7EB 50                      push eax
:004CE7EC E8FF2E0100              call 004E16F0
:004CE7F1 83C404                  add esp, 00000004
:004CE7F4 8B8D74FFFFFF            mov ecx, dword ptr [ebp+FFFFFF74]
:004CE7FA 51                      push ecx
:004CE7FB E8F02E0100              call 004E16F0
:004CE800 83C404                  add esp, 00000004

* Possible Reference to String Resource ID=00001: "Player 1"
                                  |
:004CE803 B801000000              mov eax, 00000001
:004CE808 EB3F                    jmp 004CE849

So, jetzt an dieser Stelle mchte ich Euch bitten, nicht zu erschrecken!!!
Ich werde versuchen diesen Code so gut wie mglich zu erlutern...
Also, zunchst einmal mchte an dieser Stelle Kritik ussern und zwar an die tuts, die ich als Anfnger gelesen habe. In diesen tuts standen bei solchen Stcken aus dem Code Erkrungen am Rand, die einem verrieten was dieser Teil genau macht, als sei es das natrlichste auf der Welt, dass man erkennt, was genau vor sich geht. Viele Cracker vergessen immer wieder es zu sagen, deshalb werde ich es jetzt tun. Ihr msst am Anfang immer ausprobieren was ein Call macht, oder machen knnte : zB

* Possible StringData Ref from Data Obj ->"\vphalld\sstrats.mve"
                                  |
:004CE7AE 68A0E75000              push 0050E7A0
:004CE7B3 8D8D78FFFFFF            lea ecx, dword ptr [ebp+FFFFFF78]
:004CE7B9 51                      push ecx
:004CE7BA E8812A0100              call 004E1240

Dadurch dass vor einem Call ein String, in diesem Fall ein Dateiname von den Verzeichnis auf der CD "gepushed", also oben auf den Verarbeitungsstapel gelegt wird, knnte man, zumindest ich,
anfangs vermuten, dass dieser Call versucht diese Datei zu ffnen. Oft ist es auch der Fall,
dass die Calls so ineinander verschachtelt sind, dass man nie genau rausbekommt, was sie machen.
Nun mssen wir aber versuchen zu verstehen was hier gespielt wird. Wenn dieser Teil des Programms
berprft, ob wie die richtige CD eingelegt haben, dann muss sich irgendwo ein Compare, einen
Vergleich befinden, der jenes macht. Suchen wir also die nchst Zeile mit einem "cmp" am Anfang.
cmp eax, 00000005 natrlich nicht, weil der ja checkt, ob es sich bei dem Laufwerk um ein CD-Rom handelt(s.o.):

:004CE7DC 83BD74FFFFFF00          cmp dword ptr [ebp+FFFFFF74], 00000000
:004CE7E3 7425                    je 004CE80A

Falls du nicht weisst, was je 004CE80A heisst, liest du am besten weiter ;-)
Dieser Compare vergleicht eine bestimmte Stelle im Speicher, ebp+FFFFFF74, ebp ist auch eine der
Speicherzellen, mit 0 (ist dasselbe wie 00000000, solange es sich nicht um einen String handelt). je 004CE80A bedeutet hier, wenn an dieser Stelle im Speicher 0 steht, springt der Programmcode zu 004CE80A. Schnell mal nachschauen, was da steht :

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004CE771(C), :004CE784(C), :004CE7E3(C)
|
:004CE80A 8B55FC                  mov edx, dword ptr [ebp-04]
:004CE80D D1FA                    sar edx, 1
:004CE80F 8955FC                  mov dword ptr [ebp-04], edx
:004CE812 8A45F8                  mov al, byte ptr [ebp-08]
:004CE815 0401                    add al, 01
:004CE817 8845F8                  mov byte ptr [ebp-08], al
:004CE81A E940FFFFFF              jmp 004CE75F

OK, dieser Teil ist eigentlich nicht wichtig, er verndert vermutlich nur ein paar Werte im
Speicher, aber am Schluss steht ein jmp 004CE75F. Das wiederrum bedeutet einfach, dass der
Programmcode an die Stelle 004CE75F springen soll, und was merken wir? Hey, das ist ja der Anfang
unserer CD-Check Routine (s.o.)!!!
Das heisst also, wenn der jump an der Stelle 004CE7E3 erfolgt, werden wir an den Anfang der
CD-Check Routine und der Laufwerksbuchstabe, das sind die Werte die vom jetzigen Call gendert
werden, um eins erhht. Jetzt kommt der berhmte Text aus jedem tut :
Wie wre es, wenn wir diesem Jump, dieses je 004CE80A, verndern wrden, also von Bedingung
erfllt in Bedingung nicht erfllt, in jne 004CE80A. Wre es dann nicht so, dass wie diese
Routine berlistet htten. Also Offset merken (das steht ganz unten, das zweite von rechts),
hier : @Offset 000CE7E3. Erstelle zunchst eine Kopie der VPHall.exe und bennene diese Kopie
in Cracked.exe oder so hnlich um, wie es Dir gefllt. Starte jetzt Hiew und ffne mit F9 die
Cracked.exe. Drcke zweimal Enter um in den Assembler Modus zu wechseln und drcke jetzt F5 und
gib das Offset ein. Jetzt bist du genau an der Stelle, wo du hinwolltest. ndere den Code indem
du F3 drckst. Doch was ist jetzt? Der Cursor ist bei den der Zahl (7425) gelandet. Ganz einfach,
diese Zahl ist die Hexdarstellung des Befehls je 004CE80A, 74 steht fr je und 25 ist die Anzahl
der bytes in hex, die der Programmcode nach vorne springen soll. Was ist denn jetzt schon wieder
hex? Hex ist eine andere Darstellung der Zahlen in einem 16er System. Du musst das aber
eigentlich gar nicht so genau wissen ;). Jetzt wirst du hoffentlich fragen wie den der hex code
fr jne ist. Der ist 75, kleiner aber feiner Unterschied. Einfach 75 ber 74 drberschreiben. So, 
jetzt msste bei Euch 7525 bzw. jne 004CE80A darstehen. F9 drcken, um die Exe zu updaten und mit F10 verlassen. Jetzt bist mit dir zufrieden und startest die Cracked.exe. Nein, das ist unmglich, was ist denn jetzt passiert?, das Spiel strzt einfach ab. So, ich will nicht mehr, ich lass es jetzt sein ;-)
Nicht verzweifeln, sondern berlegen, was da schiefgegangen ist. Nach Stunden von scharfen
Nachdenken fllt Dir pltzlich was ein. Aha, da war doch was mit dem ersten Teil der Routine, den
wir uns etwas nher angeschaut haben, der, der den Dateinamen vor einem Call pushed. Wenn es
wirklich stimmt, das er etwas mit dieser Datei macht, wird er wahrscheinlich ein Problem haben,
weil er diese Datei nicht finden kann. Dieser Call wird allerdings vor unserem genderten
Vergleich, ob die richtige CD im Laufwerk ist, ausgefhrt, d.h., dass dieser Call wahrscheinlich checked, ob diese Datei im Pfad "vphalld" des Laufwerkes vorhanden ist. Wir haben es jetzt (ausversehen?) so gendert, dass der Programmcode weitermacht, obwohl die Datei nicht gefunden wurde und umgekehrt, wenn die Datei gefunden wurde nicht weitermacht. Da ist es doch
einsichtig, dass das nicht gutgehen kann. Fast alle tuts, die ich gelesen habe, haben auf eine solche Weise das game gecrackt, das sie behandeln und deshalb habe ich ein game rausgesucht, wo das nicht geht...
Was knnen wir jetzt noch tun. Wir mssen das Programm so zurechtbiegen, dass es das aktuelle Verzeichnis, als CD-Rom Pfad akzeptiert.
Hier werde ich jetzt Soft-Ice ins Spiel bringen, ich weiss es ist alles ein bisschen viel auf
einmal, aber du kannst das tut ja mehrmals durcharbeiten.
Zunchst, wenn Ihr keine habt, besorgt Euch ne gescheite winice.dat (in dem zip file ist auch eine dabei), ladet erstmal Soft-Ice. So jetzt setzten wir einen Breakpoint auf GetDriveTypeA. Halt! Was ist ein Breakpoint? Wie setzte ich einen Breakpoint?
Nun, ein Breakpoint definiert einen bestimmten Punkt im Programm, an dem das Programm gestoppt
und der Debugger aktiv wird und es Dir erlaubt ist die aktuellen Stapelwerte anzuschauen, Code
zu modifizieren usw. Man setzt einen Breakpoint, indem Ihr Soft-Ice mit String+D aufruft
und "bpx getdrivetypea" eingebt. Jetzt startet Ihr nochmal die Original VPHall.exe.
Sofort ffnet sich das Soft-Ice Fenster, doch ist das? Anstatt im Code, seit Ihr an irgendeiner
Stelle im Speicher gelandet. Nun, Ihr seit bei der Definition der API Funktion GetDriveTypeA
gelandet, deshalb drckt Ihr F12, um diesen Call zu verlassen. So, aah, jetzt kommt es einem
schon bekannter vor. Mit F10 knnt die aktuelle Befehlszeile, an der sich der Balken befindet,
ausfhren. Doch halt! Erstmal berlegen, nach was suchen wir berhaupt? Also, wir versuchen den
Code so umzubiegen, dass er das VPHall Verzeichnis als die Original CD akzeptiert. Wir mssen
jetzt (nur?) die Codestelle finden an der das Verzeichnis berprft wird, finden. Also drcken
wir das erste mal F10. Jetzt sind wir an dem cmp eax,05 vorbei und befinden uns bei jne 004CE80A.
Rechts davon steht jetzt (JUMP), damit ist gemeint das eax nicht 5 ist, weil jne ja bedeutet,
springe, wenn Bedingung nicht erfllt, das liegt daran, dass der Code alle Laufwerke darauf
berprft, ob sie ein CD-Rom Laufwerk sind und die korrekte CD eingelegt haben. Nun, und
normalerweise beginnt dieser Check eben mit dem Laufwerk A: und das ist kein CD-Rom :).
Drcken wir also F5, um das Programm weiterlaufen zu lassen. Nchstes Laufwerk ist bei mir C:.
wieder nix, F5. Jetzt kommt bei mir Laufwerk D:, mein CD-Rom Laufwerk. Wenn es bei euch die
zweite Festplatte ist und E: das CD-Rom msst Ihr natrlich nochma F5 drcken usw. F12 drcken und solange F10 bis sich der Balken in der jne 004CE80A befindet. So, jetzt
erscheint auch (NO JUMP) bei unserem Befehl und wir tracen ein Stck weiter. Der nchste Befehl
lautet: lea ecx, dword ptr [ebp-08]. Uff, was das?
Dieser Befehl schreibt in das Register ecx den Wert von ebp - 8. Einige die vielleicht winzige
asm Kentnisse besitzen werden fragen : Warum benutzt man hier nicht den MOV Befehl?
Also, der mov Befehl wrde in diesem Fall in das Regiser ecx den Wert, der sich an der
Speicheradresse epb-8 befindet schreiben und nicht den Wert ebp-8 selbst. Schauen wir uns doch
einfach mal an, was den an dieser Adresse steht: in Soft-Ice "d ecx" eingeben und ins Data
Fenster schauen. Aha an dieser Stelle steht bei mir: "D:". Das ist genial...die Lsung unserer
Probleme. H? Warum? :)
Wie ganz am Anfang gesagt hat VPHall eine ziemlich einfachen Kopierschutz, d.h. es wird nur
mit der GetDriveTyp Funktion ein Laufwerk untersucht, ob es sich um ein CD-Rom handelt, und
danach nach den Spieldateien gesucht.
An dieser Stelle hilft uns eine kleine, aber ntzliche Sache, die von den Microsoft
Programmierern in Windows bzw. auch schon in DOS eingebaut haben. Wenn wir uns in einem
Verzeichnis befinden und auf eine Datei im Unterverzeichnis zugreifen wollen machen wir das, in
DOS oder der Windows Eingabeaufforderung, wenn wir uns in C:\ befinden und auf C:\gamez zugreifen 
wollen mit cd gamez ODER mit cd .\gamez. Das .\ heisst einfach und das aktuelle Verzeichnis
gehen und ins gamez Verzeichnis wechseln und letzteres brauchen wir fr den Crack. Es besteht
nmlich folgendes Problem: Das Programm liest von der Speicheradresse den CD-Rom
Laufwerksbuchstaben, bei mir D:, dann hngt es \Vphalld daran, also jetzt heisst D:\Vphalld.
Nehmen wir also an, wie man das macht erlutere ich spter, wir htten den CD Schutz entfernt und
bei dem Laufwerksbuchstaben nichts eingetragen, wrde es nicht funzen. Und zwar deswegen:
Wenn dort nichts steht, heisst es ja nix + \Vphalld, also \Vphalld. Das ist falsch, weil das
heisst, dass vom aktuellen Laufwerk alle Unterverzeichnisse verlassen werden, also auf C:\ zB
und dann dort nach dem Vphalld Verzeichnis gesucht wird. Wenn jedoch noch ein Punkt davor ist
und es .\Vphalld heisst, ist unser Ziel erreicht, weil jetzt vom aktuellen Verzeichnis, vom
VPHall Verzeichnis ausgegangen wird. Ich hoffe Ihr habt den theoretischen wenigstens teilweise
verstanden ;-)
Jetzt mssen wir unsere berlegungen nur?! in die Tat umsetzen. schauen wir uns das ganze nochmal
an:

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
                                  |
:004CE77B FF1504614F00            Call dword ptr [004F6104]
:004CE781 83F805                  cmp eax, 00000005
:004CE784 0F8580000000            jne 004CE80A
:004CE78A 8D4DF8                  lea ecx, dword ptr [ebp-08]

Wir brauchen nur zwei Assembler Befehle um alles auszufhren, was wir und berlegt haben.

1. MOV: MOV ist die Abkrzung fr MOVE. Dieser Befehl hat eigentlich den falschen Namen, weil er
	einen Wert in ein Register oder eine Speicheradresse KOPIERT und nicht VERSCHIEBT.
	Beispiel: MOV EAX, 01

2. NOP: NOP ist die Abkrzung fr NO OPERATOR und bedeutet schlichtweg, dass NICHTS getan werden
	soll.

Wir mssen jetzt zunchst einen Code produzieren, der den Laufwerksbuchstaben im Speicher
berschreibt. Die Speicheradresse kennen wir: ebp - 8. Wir knnen jetzt nicht einfach schreiben:
MOV EPB-8, "." oder so hnlich. Zuerst mssen wir ebp - 8 in eckigen Klammern schreiben, also
[ebp-8], weil wir in die Speicheradresse, die in ebp-8 festgehalten schreiben wollen und nicht
in ebp selber. Zweitens muss in einem MOV Ausdruck immer mindestens ein Register vorkommen, und
Speicheradressen wie [ebp-8] sind keine Register. Und drittens funktioniert das mit den Punkt
anders. Ihr msst den Hex-Wert eines Zeichens angeben. Diesen Wert findest du heraus indem Du
in Hiew F7 fr Suchen drckst. Gebe dort im ASCII Feld das Zeichen ein und unten wird der
Hex-Wert ausgegeben. Fr einen Punkt ist dieser "2E". Unser Aufbau des Codes muss jetzt also
lauten : Kopiere 2E in ein Register zB EAX, Kopiere EAX in die Speicheradresse [ebp-08] und
schreibe in EAX 05 hinein, damit das Programm immer denkt, das es sich bei dem Laufwerk um ein
CD-Rom handelt (s.o.). Nur wo nehmen wir den Platz fr den Code her?
Schaut doch mal! Wir brauchen die gesamte Routine von GetDriveTypeA bis jne 004CE80A nicht mehr,
weil das Programm ja sowieso immer denken soll, dass der aktuelle Laufwerksbuchstabe ein CD-Rom
ist. Also Hiew starten und zweimal ENTER drcken, um in den Debug-Modus zu gehen und F5 fr goto
drcken und das Offset eingeben. einfach bei der Zahl links neben dem Befehl nehmen und die 4
weglassen, hier 000CE77B. Jetzt F3 drcken, um den Code zu editieren, und dann F2 um einen
Assembler Befehl einzugeben. Zunchst 2E in EAX schreiben: MOV EAX, 2E. Jetzt springen wir
automatisch in die nchste Zeile, dort mssen wir EAX in die Speicheradresse [ebp-8] schreiben,
also MOV [EBP-8], EAX, Hiew stellt den Ausdruck richtig, bei euch wird dann dastehen:
mov [ebp][-0008],eax und das ist richtig so. Zuletzt schreiben wir noch 5 in EAX: MOV EAX, 05.
So als allerletztes, mssen wir noch zweimal nop angeben, weil unser Code zwei Byte kleiner ist,
als der Originalcode. Wenn wir das nicht tun, beeinflussen wir den weiteren Code!!!
Wenn jetzt dir nchste Befehlszeile in der Box erscheint ESC drcken, dann F9 um die Exe zu
updaten and schliesslich F10, um Hiew zu verlassen. VPHall starten, JUHUU es geht :-)

Schlusswort:
----------------------------------------------
Wie viele Leute es sagen, ist das mein allererstes tutorial bers cracken. Ich hab' mir schon
berlegt, was ich nchstes schreiben knnte, aber ich glaube es ist besser, wenn ich mich nach
Euren requests richte. Wenn ich keine erhalte, war das, das erste und letzte tut von mir.
Ihr knnt mir natrlich auch mailen, wenn Ihr Verbesserungsvorschlge habt, oder Kritik ussern
wollt.

E-mail:Redeema@gmx.net

Das Update Installieren:
----------------------------------------------

Wenn sich das Update nicht installieren lsst, hast du wahrscheinlich irgendeinen
Rip ausm Netz. Dann musst du in der registry unter, so isses zumindest bei Windows98,
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\
den Schlssel "VPHall.exe" einfgen, unter "(Standard)" dein Virtual Pool Hall directory eingeben
und noch eine Zeichenkette namens "PATH" einfgen und da nochmal dein VPH dir eingeben.
So, nun msste das Update installierbar sein.

!TO THE ENGLISH READERS!
Sorry, but i won't translate this long long tut. If you now someone, who wants to do, well,
he can do it, he will get his own greeting part.

Greetingz: sn00pee, gONZo, Harlequin, Milhouse, Goose, den fetten Fhrmann und seine linke Hand,
	   Long Ding Dong und den ganzen UC Rest, hardlock, popKing, deadliner, manax, moolok
	   und die ganze blz Crew und alle die ich vergessen hab'

(c) Redeema, 2000